#!/usr/bin/python
# -*-coding:Utf-8 -*

import socket
import sys

import partie as m_partie
import joueur as m_joueur
import spectateur as m_spectateur


# Paramètres par défaut
p_host = "0.0.0.0"
p_port = 2013
p_dictionnaire = "dico.txt"
p_max = 4
p_timeout = 30
p_limite_abus = 3

# Récupération des arguments
i = 1
while i < len(sys.argv) :
	if sys.argv[i] == "-abus" :
		p_limite_abus = max(int(sys.argv[i + 1]), 1)
	elif sys.argv[i] == "-dico" and sys.argv[i + 1].strip() != "" :
		p_dictionnaire = str(sys.argv[i + 1])
	elif sys.argv[i] == "-max" :
		# La partie doit se jouer entre au moins 2 joueurs
		p_max = max(int(sys.argv[i + 1]), 2)
	elif sys.argv[i] == "-port" :
		p_port = int(sys.argv[i + 1])
	elif sys.argv[i] == "-timeout" :
		# Le timeout doit être d'au moins 1s
		p_timeout = max(int(sys.argv[i + 1]), 1)
	i += 2

# Vérification du dictionnaire
try :
	fichier = open(p_dictionnaire, "r")
	contenu = fichier.read()
	fichier.close()
	p_mots = []
	for ligne in contenu.split("\n") :
		if ligne.strip() != "" and not ligne.startswith("#") :
			p_mots.append(ligne.strip())
	if len(p_mots) < 1 :
		print("Le dictionnaire est vide.")
		sys.exit()
except :
	print("Impossible d'ouvrir le fichier \"{}\".".format(p_dictionnaire))
	sys.exit()

# Initialisation de la partie
partie = m_partie.Partie()
partie.mots = p_mots
partie.max = p_max
partie.timeout = p_timeout
partie.limite_abus = min(p_limite_abus, p_max)
print("La partie peut accueillir {} joueurs, la durée d'un tour est de {}s, le timeout est fixé à {}s et le dictionnaire contient {} mots.".format(partie.max, partie.duree_round, partie.timeout, len(partie.mots)))

try :
	socket_serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	socket_serveur.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
	socket_serveur.bind((p_host, p_port))
	socket_serveur.listen(10)
	stop = False
	# Attente de connexions entrantes
	while not stop :
		socket, adresse = socket_serveur.accept()
		print("Nouvelle connexion de {}:{}".format(adresse[0], adresse[1]))
		partie.verrou.acquire()
		# Si la partie n'a pas commencé
		if partie.round == 0 :
			partie.nouveau_joueur(m_joueur.Joueur(socket, adresse))
		else :
			partie.nouveau_spectateur(m_spectateur.Spectateur(socket, adresse))
		partie.verrou.release()
except KeyboardInterrupt as e :
	print("\nFermeture du serveur.")
except :
	print("Fermeture du serveur.")
finally :
	socket_serveur.close()
